package com.AdvancedDemos.继承;

public class final关键字 {

    public static final double PI = 3.13415926;//常量

    public static void main(String[] args) {
        //final关键字意思是最终
        //修饰类:最终类,无法被继承
        //修饰方法:最终方法,无法被子类重写
        //修饰变量:常变量,变量只能被赋值一次,如果是基本类型,那么不能修改值,如果是引用类型,那么不能修改地址(即当中的值)
        //abstract 不能和 final 同时使用,互相矛盾

        //final修饰局部变量
        final double pi;
        pi = 3.1415926;
//        pi = 1.0;//无法将值赋给 final 变量 'pi'

        final int[] arr = {10, 20, 30};
//        arr = null;//报错:无法将值赋给 final 变量 'arr'  final修饰引用变量时,无法修改其地址,但是可以改变原地址里面的内容
        arr[0] = 222;//合法


        E e = new E();
//        e.name = "hello";//报错:无法将值赋给 final 变量 'name'     无法修改final修饰的成员变量的值
//        E.schoolName = "白马程序员";//报错:无法将值赋给 final 变量 'schoolName'     同样无法修改final修饰的静态成员变量(类变量)

        System.out.println(E.SCHOOL_NAME);//程序编译后,.class字节码文件中,常量会被"宏替换",即出现常量的地方全部会被替换为其记住的字面量,这样可以保证使用常量和直接使用字面量性能是一样的,即不需要"找到类,找到常量名,再找到值"
    }

    public static void pay(final double discount) {
        //final修饰形参折扣后,内部无法再修改
    }
}

class E {
    //    final String name;报错:变量 'name' 可能尚未初始化,final成员变量要赋初值
    final String name = "hola";//尽管可以用final修饰成员变量,但没有太多实际意义,会导致所有对象的这一属性都相同,而且后期对象还不能修改这一属性

    public final static String SCHOOL_NAME = "University of JiangSu";//final修饰静态成员变量(类变量),final static修饰的成员变量一般叫做"常量",通常用于记录系统的配置信息,一般也同时声明成public便于调用,且用大写表示,多个单词中间用下划线连接起来
}

final class A2 {

}
//class B2 extends A2{}//无法从final 'com.就业班.继承.A2' 继承
//工具类可以用final修饰,来禁止别人继承,如:Math类
//public final class Math {......}


class C {
    final public void test() {

    }
}

class D extends C {

//    @Override
//    public void test() {

    //test()' 无法重写 'com.就业班.继承.C' 中的 'test()'；重写的方法为 final

//}
}
